package util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import main.BCP;

/**
 * Classe responsavel pela manipulacao de arquivos.
 * 
 * @author Andreia Rodrigues de Oliveira, Raphael Monteiro, Regis Hideki Hatori;
 * 
 */
public class ManipuladoraDeArquivos {

	/**
	 * Nome do arquivo .zip que contem os processos a serem carregados.
	 */
	public static final String NOME_ARQUIVO_ZIP = "processos.zip";

	/**
	 * Carrega os processos
	 * 
	 * @return Retorna os processos carregados
	 * @throws Exception	Exececao lancada caso o processo nao possa ser carregado
	 */

	public static Queue<BCP> carregaProcessos() throws Exception {

		Queue<BCP> processos = new LinkedList<BCP>();

		ZipFile zFile = new ZipFile(NOME_ARQUIVO_ZIP);
		Enumeration<? extends ZipEntry> enumDeArquivosDoZip = zFile.entries();

		while (enumDeArquivosDoZip.hasMoreElements()) {

			ZipEntry zipEntry = enumDeArquivosDoZip.nextElement();

			if (!zipEntry.isDirectory()) {

				InputStream input = zFile.getInputStream(zipEntry);
				InputStreamReader isr = new InputStreamReader(input, "UTF-8");
				BufferedReader arquivo = new BufferedReader(isr);

				String nomeDoProcesso = arquivo.readLine();

				List<String> instrucoes = new ArrayList<String>();
				String linha;
				while (linhaDeveSerLida(linha = arquivo.readLine())) {
					instrucoes.add(linha);
				}

				BCP processo = new BCP(nomeDoProcesso, instrucoes);
				processos.add(processo);

				Logger.carregandoProcesso(processo);

				arquivo.close();
			}
		}
		return processos;
	}

	private static boolean linhaDeveSerLida(String string) {
		return (string != null && !string.trim().equals(""));
	}

	/**
	 * Escreve no arquivo e exibe em linha de comando a mensagem fornecida.
	 * 
	 * @param arquivo	Parametro com o arquivo
	 * @param mensagem	Parametro com a mensagem a ser escrita
	 */
	public static void escreveEmArquivoEConsole(File arquivo, String mensagem) {

		try {

			FileOutputStream fos = new FileOutputStream(arquivo, true);
			System.out.println(mensagem);
			mensagem = mensagem + "\n";
			fos.write(mensagem.getBytes());

			fos.close();

		} catch (IOException e) {

			e.printStackTrace();
			System.err.println("Erro ao tentar manipular arquivo " + arquivo);

		}
	}
}
